O R possui uma ampla capacidade e versatilidade para a execução de praticamente qualquer tarefa - inclusive para a criação e edição de mapas. É possível usar o R e toda a sua funcionalidade de forma muito similar àquela de programa como o ArcGIS. No entanto, este não será o nosso objetivo aqui, mas sim apresentar a funcionalidade mais básica possível do R para a criação de mapas (principalmente aqueles que sempre queremos adicionar em uma dissertação, tese ou manuscrito).
Existe uma diversidade enorme de material e sites na internet com material sobre a confecção de mapas no R. Sugiro dar uma olhada de forma mais detalhada no material gerado pela Dra. Andrea Sanchez Tapia para este mesmo curso em 2016 (99_cursos_anteriores/09_Rmaps) e/ou nos sites listados abaixo:
Alguns pacotes úteis para a confecção de mapas no R são:
RgoogleMaps: baixar mapas do Google;raster: pacote para a criação e manipulação de arquivos raster;maptools: ler ESRI shapefiles;rgdal;maps: mapas simples, eixos, escalas e cidades;mapdata: base de dados WorldHires e rios;rworldmap: outra base de dados de mapas do mundo;ggplot2;ggmap: mapas customizados, open street maps e outras funcionalidades de mapas para o ggplot2;ggalt: outras funcionalidades para a customização de mapas e escalas;rasterVis: para facilitar a integração de arquivos raster com o ggplot2;O pacote maps pode plotar mapas simples através de dados existentes no próprio pacote:
# carregando pacotes
library(maps) # plotagem genérica de mapas
library(mapdata) # base de dados worldHires
# plotando o mapa do Brasil
map(database = "worldHires", regions = "Brazil")
Você pode adicionar a projeção dos outros países no espaço disponível:
map(database = "worldHires", regions = "Brazil")
map(add = TRUE)
Adicionando os eixos de longitude e latitude:
map(database = "worldHires", regions = "Brazil")
map(add = TRUE)
map.axes()
Adicionando escala ao mapa e uma linha para representar o Equador:
map(database = "worldHires", regions = "Brazil")
map(add = TRUE)
map.axes()
map.scale(ratio = FALSE, cex = 0.7)
abline(h = 0, lty = 2)
Você também pode plotar os pontos correspondentes às cidades ao mapa usando a função:
map(database = "worldHires", regions = "Brazil")
map(add = TRUE)
map.axes()
map.scale(ratio = FALSE, cex = 0.7)
abline(h = 0, lty = 2)
map.cities(country = "Brazil", minpop = 1000000, pch = 19, cex = 1.2)
Modifique as opções apresentadas anteriormente para explorar as opções gráficas disponíveis nas funções utilizadas.
Uma outra opção para criar mapas com base nos dados já existentes nos pacotes do R é através do ggplot2, através da função borders. A função borders (do ggplot2) funciona de forma similar àquela do pacote maps.
# carregando o ggplot2
suppressPackageStartupMessages(library(ggplot2))
Utilize a função borders do pacote ggplot2 para criar um mapa editado do Brasil.
Como vimos alguns dos pacotes disponíveis no R já oferecem mapas embutidos em suas funções. Todavia, muitas destas funções e seus mapas não satisfazem totalmente algumas das necessidades que alguns podem ter - e outros não satisfazem nem um pouco. Na realidade, na maior parte das vezes, é mais útil termos um conjunto de shapefiles ou de rasters a partir dos quais vamos conseguir construir os mapas que de fatos queremos.
Você pode encontrar arquivos para a confecção de mapas em:
raster::getData)raster::getData)A função raster::getData é particularmente útil para baixarmos os rasters e shapefiles diretamente de base de dados online. Não vamos fazer o download de um conjunto de rasters aqui pois necessitamos que a internet esteja totalmente funcional; todavia, podemos observar um raster que já foi baixado a partir do “worldclim” abaixo:
# carregando o pacote raster
suppressPackageStartupMessages(library(raster))
# carregando o arquivo de raster do worldclim
bio1 <- raster("layers/bio1.bil")
# plotando o raster
plot(bio1, xlab = "Longitude", ylab = "Latitude", main = "Temperature Média do Ar (x 10 ºC)")
Você pode descobrir as coordenadas de uma localidade usando a função ggmap::geocode, como se estivesse fazendo uma busca nos mapas do Google.
# carregando pacote
suppressPackageStartupMessages(library(ggmap))
# quais as coordenadas da ilha do fundão?
geocode(location = "Ilha do Fundão")
## Information from URL : http://maps.googleapis.com/maps/api/geocode/json?address=Ilha%20do%20Fund%C3%A3o&sensor=false
## lon lat
## 1 -43.2259 -22.86269
Você pode extrair os dados das coordenadas de um objeto do tipo raster usando a função raster::extract, que pede um objeto raster x e uma matriz ou data.frame como um objeto y:
# temperatura média anual do ar na ilha do fundão (x 10ºC)
extract(x = bio1, y = cbind(-43.2259, -22.86269))
##
## 224
Para facilitar a manipulação de arquivos com formato raster, você pode usar o pacote rasterVis e a função gplot para plotar o arquivo raster utilizando as funções do ggplot.
# carregando pacote
suppressPackageStartupMessages(library(rasterVis))
# plotando figura
gplot(bio1) +
geom_tile(aes(fill = value)) +
scale_fill_gradient(low = 'blue2', high = 'firebrick1') +
coord_equal()
bio12.bil, que corresponde aos dados da precipitação anual média.Além de arquivos raster, podemos carregar shapefiles no R através da função readShapeSpatial do pacote maptools (ou variantes: readShapeLines, readShapePoints, readShapePoly). Por exemplo:
# carregando pacote
library(maptools)
# carregando o shapefile
brasil <- readShapeSpatial("layers/BRA_adm/BRA_adm3.shp")
O shapefile é um objeto que também pode ser manipulado e plotado individualmente!
# somente as dez primeiras linhas
brasil@data[1:10,]
## ID_0 ISO NAME_0 ID_1 NAME_1 ID_2 NAME_2 ID_3 NAME_3
## 0 33 BRA Brazil 1 Acre 1 Acrelândia 1 Acrelândia
## 1 33 BRA Brazil 1 Acre 2 Assis Brazil 2 Assis Brazil
## 2 33 BRA Brazil 1 Acre 3 Brasiléia 3 Brazileia
## 3 33 BRA Brazil 1 Acre 4 Bujari 4 Bujari
## 4 33 BRA Brazil 1 Acre 5 Capixaba 5 Capixaba
## 5 33 BRA Brazil 1 Acre 6 Cruzeiro do Sul 6 Cruzeiro do Sul
## 6 33 BRA Brazil 1 Acre 7 Epitaciolândia 7 Epitaciolândia
## 7 33 BRA Brazil 1 Acre 8 Feijó 8 Feijó
## 8 33 BRA Brazil 1 Acre 9 Jordão 9 Jordão
## 9 33 BRA Brazil 1 Acre 10 Mâncio Lima 10 Mâncio Lima
## TYPE_3 ENGTYPE_3 NL_NAME_3 VARNAME_3
## 0 Distrito District <NA> <NA>
## 1 Distrito District <NA> <NA>
## 2 Distrito District <NA> <NA>
## 3 Distrito District <NA> <NA>
## 4 Distrito District <NA> <NA>
## 5 Distrito District <NA> <NA>
## 6 Distrito District <NA> <NA>
## 7 Distrito District <NA> <NA>
## 8 Distrito District <NA> <NA>
## 9 Distrito District <NA> <NA>
# cortando o shapefile para o estado
estado_rio <- subset(brasil, brasil@data$NAME_1 == "Rio de Janeiro")
# observando o shapefile
estado_rio@data[1:10,]
## ID_0 ISO NAME_0 ID_1 NAME_1 ID_2 NAME_2 ID_3
## 6683 33 BRA Brazil 19 Rio de Janeiro 3564 Angra dos Reis 6684
## 6684 33 BRA Brazil 19 Rio de Janeiro 3564 Angra dos Reis 6685
## 6685 33 BRA Brazil 19 Rio de Janeiro 3564 Angra dos Reis 6686
## 6686 33 BRA Brazil 19 Rio de Janeiro 3564 Angra dos Reis 6687
## 6687 33 BRA Brazil 19 Rio de Janeiro 3564 Angra dos Reis 6688
## 6688 33 BRA Brazil 19 Rio de Janeiro 3564 Angra dos Reis 6689
## 6689 33 BRA Brazil 19 Rio de Janeiro 3565 Aperibé 6690
## 6690 33 BRA Brazil 19 Rio de Janeiro 3566 Araruama 6691
## 6691 33 BRA Brazil 19 Rio de Janeiro 3566 Araruama 6692
## 6692 33 BRA Brazil 19 Rio de Janeiro 3566 Araruama 6693
## NAME_3 TYPE_3 ENGTYPE_3 NL_NAME_3 VARNAME_3
## 6683 Abraao Distrito District <NA> <NA>
## 6684 Angra dos Reis Distrito District <NA> <NA>
## 6685 Cunhambebe Distrito District <NA> <NA>
## 6686 Jacuecanga Distrito District <NA> <NA>
## 6687 Mambucaba Distrito District <NA> <NA>
## 6688 Praia de Aracatiba Distrito District <NA> <NA>
## 6689 Aperibé Distrito District <NA> <NA>
## 6690 Araruama Distrito District <NA> <NA>
## 6691 Morro Grande Distrito District <NA> <NA>
## 6692 São Vicente de Paula Distrito District <NA> <NA>
# cortando o shapefile para a cidade
cidade_rio <- subset(brasil, brasil@data$NAME_2 == "Rio de Janeiro")
# observando o shapefile
cidade_rio@data
## ID_0 ISO NAME_0 ID_1 NAME_1 ID_2 NAME_2 ID_3
## 6929 33 BRA Brazil 19 Rio de Janeiro 3630 Rio de Janeiro 6930
## 6930 33 BRA Brazil 19 Rio de Janeiro 3630 Rio de Janeiro 6931
## 6931 33 BRA Brazil 19 Rio de Janeiro 3630 Rio de Janeiro 6932
## 6932 33 BRA Brazil 19 Rio de Janeiro 3630 Rio de Janeiro 6933
## 6933 33 BRA Brazil 19 Rio de Janeiro 3630 Rio de Janeiro 6934
## 6934 33 BRA Brazil 19 Rio de Janeiro 3630 Rio de Janeiro 6935
## 6935 33 BRA Brazil 19 Rio de Janeiro 3630 Rio de Janeiro 6936
## 6936 33 BRA Brazil 19 Rio de Janeiro 3630 Rio de Janeiro 6937
## 6937 33 BRA Brazil 19 Rio de Janeiro 3630 Rio de Janeiro 6938
## 6938 33 BRA Brazil 19 Rio de Janeiro 3630 Rio de Janeiro 6939
## 6939 33 BRA Brazil 19 Rio de Janeiro 3630 Rio de Janeiro 6940
## 6940 33 BRA Brazil 19 Rio de Janeiro 3630 Rio de Janeiro 6941
## 6941 33 BRA Brazil 19 Rio de Janeiro 3630 Rio de Janeiro 6942
## 6942 33 BRA Brazil 19 Rio de Janeiro 3630 Rio de Janeiro 6943
## 6943 33 BRA Brazil 19 Rio de Janeiro 3630 Rio de Janeiro 6944
## 6944 33 BRA Brazil 19 Rio de Janeiro 3630 Rio de Janeiro 6945
## 6945 33 BRA Brazil 19 Rio de Janeiro 3630 Rio de Janeiro 6946
## 6946 33 BRA Brazil 19 Rio de Janeiro 3630 Rio de Janeiro 6947
## 6947 33 BRA Brazil 19 Rio de Janeiro 3630 Rio de Janeiro 6948
## 6948 33 BRA Brazil 19 Rio de Janeiro 3630 Rio de Janeiro 6949
## 6949 33 BRA Brazil 19 Rio de Janeiro 3630 Rio de Janeiro 6950
## 6950 33 BRA Brazil 19 Rio de Janeiro 3630 Rio de Janeiro 6951
## 6951 33 BRA Brazil 19 Rio de Janeiro 3630 Rio de Janeiro 6952
## 6952 33 BRA Brazil 19 Rio de Janeiro 3630 Rio de Janeiro 6953
## 6953 33 BRA Brazil 19 Rio de Janeiro 3630 Rio de Janeiro 6954
## 6954 33 BRA Brazil 19 Rio de Janeiro 3630 Rio de Janeiro 6955
## 6955 33 BRA Brazil 19 Rio de Janeiro 3630 Rio de Janeiro 6956
## 6956 33 BRA Brazil 19 Rio de Janeiro 3630 Rio de Janeiro 6957
## 6957 33 BRA Brazil 19 Rio de Janeiro 3630 Rio de Janeiro 6958
## 6958 33 BRA Brazil 19 Rio de Janeiro 3630 Rio de Janeiro 6959
## NAME_3 TYPE_3 ENGTYPE_3 NL_NAME_3 VARNAME_3
## 6929 Anchieta Distrito District <NA> <NA>
## 6930 Bangu Distrito District <NA> <NA>
## 6931 Barra da Tijuca Distrito District <NA> <NA>
## 6932 Botafogo Distrito District <NA> <NA>
## 6933 Campo Grande Distrito District <NA> <NA>
## 6934 Centro Distrito District <NA> <NA>
## 6935 Cidade de deus Distrito District <NA> <NA>
## 6936 Complexo do Alemao Distrito District <NA> <NA>
## 6937 Copacabana Distrito District <NA> <NA>
## 6938 Guaratiba Distrito District <NA> <NA>
## 6939 Ilha do Governador Distrito District <NA> <NA>
## 6940 Inhaúma Distrito District <NA> <NA>
## 6941 Iraja Distrito District <NA> <NA>
## 6942 Jagarepagua Distrito District <NA> <NA>
## 6943 Lagoa Distrito District <NA> <NA>
## 6944 Madureira Distrito District <NA> <NA>
## 6945 Mare Distrito District <NA> <NA>
## 6946 Meier Distrito District <NA> <NA>
## 6947 Pavuna Distrito District <NA> <NA>
## 6948 Penha Distrito District <NA> <NA>
## 6949 Portuaria Distrito District <NA> <NA>
## 6950 Ramos Distrito District <NA> <NA>
## 6951 Realengo Distrito District <NA> <NA>
## 6952 Rio Comprido Distrito District <NA> <NA>
## 6953 Rocinha Distrito District <NA> <NA>
## 6954 São Cristóvão Distrito District <NA> <NA>
## 6955 Santa Cruz Distrito District <NA> <NA>
## 6956 Santa Teresa Distrito District <NA> <NA>
## 6957 Tijuca Distrito District <NA> <NA>
## 6958 Vila Isabel Distrito District <NA> <NA>
Nós podemos plotar estes objetos através da função da plot:
# mapa do estado
plot(estado_rio)
# mapa da cidade
plot(cidade_rio)
No entanto, podemos também transformar estes shapefiles em um data.frame e fazermos as figuras no ggplot2, através da função fortify.
# criando um objeto do tipo data.frame para o pais
pais <- fortify(brasil)
## Regions defined for each Polygons
# observando o objeto
head(pais)
## long lat order hole piece id group
## 1 -67.16084 -9.982599 1 FALSE 1 0 0.1
## 2 -67.15184 -9.978957 2 FALSE 1 0 0.1
## 3 -67.13828 -9.973469 3 FALSE 1 0 0.1
## 4 -67.11916 -9.967169 4 FALSE 1 0 0.1
## 5 -67.10312 -9.961880 5 FALSE 1 0 0.1
## 6 -67.08989 -9.900072 6 FALSE 1 0 0.1
# criando um objeto do tipo data.frame para o estado
estado <- fortify(estado_rio)
## Regions defined for each Polygons
# observado o objeto
head(estado)
## long lat order hole piece id group
## 1 -44.11069 -23.18097 1 FALSE 1 6683 6683.1
## 2 -44.11097 -23.18097 2 FALSE 1 6683 6683.1
## 3 -44.11097 -23.18125 3 FALSE 1 6683 6683.1
## 4 -44.11153 -23.18125 4 FALSE 1 6683 6683.1
## 5 -44.11153 -23.18153 5 FALSE 1 6683 6683.1
## 6 -44.11180 -23.18153 6 FALSE 1 6683 6683.1
# criando um objeto do tipo data.frame para a cidade
cidade <- fortify(cidade_rio)
## Regions defined for each Polygons
# observando o objeto
head(cidade)
## long lat order hole piece id group
## 1 -43.36049 -22.84699 1 FALSE 1 6929 6929.1
## 2 -43.37932 -22.85029 2 FALSE 1 6929 6929.1
## 3 -43.38162 -22.83656 3 FALSE 1 6929 6929.1
## 4 -43.39827 -22.84034 4 FALSE 1 6929 6929.1
## 5 -43.39690 -22.84560 5 FALSE 1 6929 6929.1
## 6 -43.40036 -22.84342 6 FALSE 1 6929 6929.1
# um mapa do estado do Rio de Janeiro
ggplot() +
geom_polygon(data = estado, aes(x = long, y = lat, group = group, fill = id), colour = "black", show.legend = FALSE) +
coord_equal()
# um mapa para a cidade do Rio de Janeiro
ggplot() +
geom_polygon(data = cidade, aes(x = long, y = lat, group = group, fill = id), colour = "black", show.legend = FALSE) +
coord_equal()
Esta transformação com a função fortify, no entanto, não é sempre necessária!
ggplot() +
geom_polygon(data = estado_rio, aes(x = long, y = lat, group = group, fill = id), colour = "black", show.legend = FALSE) +
coord_equal()
## Regions defined for each Polygons
Carregue este shapefile do Brasil, e:
* Crie um mapa do Estado do Rio de Janeiro, mas adicione cor somente à cidade do Rio de Janeiro;
* Crie um mapa da Cidade do Rio de Janeiro, mas adicione cor somente ao seu Bairro/Região (ou então escolha um bairro ou região à sua escolha caso você não more na cidade do Rio de Janeiro).
Além de termos a opção de baixar arquivos dos tipos raster e shapefiles, nós também temos a opção de fazer o download de arquivos e mapas diretamente da internet, e projetarmos informações sobre eles. Muitas das funções que fazem isto estão no pacote ggmap.
source:
google;osm;stamen;cloudmade.maptype:
terrain;toner;watercolor;satellite;roadmap;hybrid;fundao <- get_map(location = c(lon = -43.2259, lat = -22.85769), source = "stamen", maptype = "watercolor", zoom = 14)
plot(fundao)
rio <- get_map(location = c(lon = -43.1729, lat = -22.90685), source = "stamen", maptype = "toner", zoom = 12)
plot(rio)
rio <- get_map(location = c(lon = -43.1729, lat = -22.90685), source = "google", maptype = "satellite", zoom = 14)
plot(rio)
Uma outra opção para conseguir mapas da internet está no pacote RgoogleMaps, através da função GetMap
rio_terreno <- GetMap(center = c(-22.92, -43.35), zoom = 11, maptype = "terrain", RETURNIMAGE = TRUE)
PlotOnStaticMap(rio_terreno)
rio_mobile <- GetMap(center = c(-22.92, -43.35), zoom = 11, maptype = "mobile", RETURNIMAGE = TRUE)
PlotOnStaticMap(rio_mobile)
rio_hybrid <- GetMap(center = c(-22.92, -43.35), zoom = 11, maptype = "hybrid", RETURNIMAGE = TRUE)
PlotOnStaticMap(rio_hybrid)